C Socket Programming হল একটি শক্তিশালী প্রক্রিয়া যা নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি সিস্টেমের মধ্যে বিভিন্ন প্রোগ্রামের মধ্যে যোগাযোগ বা নেটওয়ার্কের মাধ্যমে ডেটা আদান-প্রদান করতে সহায়তা করে। Advanced C socket programming বিভিন্ন কৌশল ব্যবহার করে, যেমন নন-ব্লকিং সকেট, মাল্টিপল ক্লায়েন্ট হ্যান্ডলিং, থ্রেডিং, এবং সিকিউর সকেট সংযোগ। এখানে Error Handling সম্পর্কে বিস্তারিত আলোচনা করা হবে যাতে আপনি সকেট প্রোগ্রামিংয়ে ত্রুটি হ্যান্ডলিং আরও দক্ষভাবে করতে পারেন।
C socket programming এ, সকেট দুটি প্রধান উপাদান হিসাবে কাজ করে:
একটি TCP সার্ভার যা একাধিক ক্লায়েন্টের সাথে যোগাযোগ স্থাপন করে এবং ডেটা গ্রহণ করে পাঠায়।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAX_CLIENTS 5
void handle_client(int client_socket) {
char buffer[1024] = {0};
int valread = read(client_socket, buffer, sizeof(buffer));
if (valread == -1) {
perror("Error reading from socket");
return;
}
printf("Client message: %s\n", buffer);
send(client_socket, "Hello from server", 18, 0);
close(client_socket);
}
int main() {
int server_fd, client_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
printf("Server listening on port %d\n", PORT);
while (1) {
if ((client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("Accept failed");
continue;
}
printf("New client connected\n");
handle_client(client_socket);
}
return 0;
}
এই কোডটি একটি TCP সার্ভার তৈরি করে যা একাধিক ক্লায়েন্টের সাথে সংযোগ স্থাপন করতে সক্ষম এবং ক্লায়েন্টের পাঠানো বার্তা গ্রহণ এবং উত্তর পাঠায়।
UDP ব্যবহার করে একটি সার্ভার যা নির্দিষ্ট পোর্টে ডেটা গ্রহণ করবে।
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
int sockfd;
struct sockaddr_in server_addr, client_addr;
char buffer[MAX_BUFFER_SIZE];
socklen_t addrlen = sizeof(client_addr);
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Server listening on UDP port %d\n", PORT);
while (1) {
int n = recvfrom(sockfd, (char *)buffer, MAX_BUFFER_SIZE, MSG_WAITALL,
(struct sockaddr *) &client_addr, &addrlen);
buffer[n] = '\0';
printf("Client message: %s\n", buffer);
sendto(sockfd, "Hello from server", 18, MSG_CONFIRM, (const struct sockaddr *) &client_addr, addrlen);
}
return 0;
}
এই কোডে, UDP সার্ভার নির্দিষ্ট পোর্টে ডেটা গ্রহণ করে এবং ক্লায়েন্টকে একটি উত্তর পাঠায়।
C Socket Programming-এ Error Handling অত্যন্ত গুরুত্বপূর্ণ কারণ এটি নেটওয়ার্ক কমিউনিকেশনে ব্যর্থতা রোধ করতে সহায়তা করে। সঠিক ত্রুটি পরিচালনা ছাড়া, একটি সিস্টেম বা অ্যাপ্লিকেশন যে কোনো মুহূর্তে ক্র্যাশ হতে পারে।
Socket Creation Error:
socket()
ফাংশন যদি সঠিকভাবে কাজ না করে, তখন এটি -1
রিটার্ন করে এবং errno
সেট করে।perror()
অথবা strerror()
ব্যবহার করে ত্রুটি বার্তা বের করা।int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
Bind Error:
bind()
ফাংশন পোর্ট বা আইপি ঠিকানায় সঠিকভাবে সংযুক্ত না হয়, এটি -1
রিটার্ন করে।if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
exit(EXIT_FAILURE);
}
Listen Error:
listen()
ফাংশন যদি কাজ না করে তবে এটি -1
রিটার্ন করে।if (listen(sockfd, 5) < 0) {
perror("Listen failed");
exit(EXIT_FAILURE);
}
Accept Error:
accept()
যদি ক্লায়েন্ট থেকে সংযোগ গ্রহণ করতে ব্যর্থ হয়, তাহলে এটি -1
রিটার্ন করে।int new_socket = accept(sockfd, (struct sockaddr *)&client_addr, &addr_len);
if (new_socket < 0) {
perror("Accept failed");
continue;
}
Send/Receive Error:
send()
বা recv()
ফাংশন ডেটা পাঠানোর বা গ্রহণের সময় ত্রুটি হতে পারে।int n = recv(new_socket, buffer, sizeof(buffer), 0);
if (n == -1) {
perror("Receive failed");
close(new_socket);
}
perror()
এবং strerror()
ব্যবহার করুন: সঠিক ত্রুটি বার্তা প্রিন্ট করতে perror()
বা strerror()
ব্যবহার করা উচিত।exit()
ব্যবহার করে প্রোগ্রাম থেকে বের হওয়ার পরিবর্তে, পুনরায় চেষ্টা বা সিস্টেম সম্পাদনের সঠিক কোড ব্যবহার করুন।Advanced C Socket Programming এবং Error Handling অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি নেটওয়ার্ক প্রোগ্রামিংয়ের নির্ভরযোগ্যতা এবং স্থিতিশীলতা নিশ্চিত করে। ত্রুটি হ্যান্ডলিং প্রোগ্রামে ডেটা ট্রান্সফার এবং নেটওয়ার্ক সংযোগের ক্ষেত্রে ব্যর্থতার কারণে সিস্টেমের ক্র্যাশ বা অন্যান্য সমস্যা প্রতিরোধ করতে সহায়ক। C ভাষায় সকেট প্রোগ্রাম
িং ব্যবহার করে নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করার সময় সঠিক ত্রুটি পরিচালনা এবং নিরাপদ সংযোগ নিশ্চিত করা আবশ্যক।
common.read_more